// 参考数据格式
// {
//   // 缩放
//   scale: {
//     min: 1, // 最小缩比例（固定无需传入）
//     max: 2, // 最大缩比例
//     -step: 0.1, // 缩放步长
//     -rate: 0.6, // <最小缩放率> // 无需传入，自动计算：画布宽度 / 背景宽度
//     scaling: 1.8, // 当前缩放比例
//   },
//   // 背景
//   background: {
//     src: '/map.jpg',
//     width: 1186,
//     height: 2000,
//     offsetX: 0, // 视角偏移坐标X
//     offsetY: 0, // 视角偏移坐标Y
//   },
//   // 遮罩
//   wrapper: {
//     backgroundColor: 'rgba(0, 0, 0, 0.5)',
//   },
//   // 地块
//   stages: [
//     {
//       ...(自定义数据)
//       border: ['30,30', '100,30', '100,100', '100,30'], // 地块边界坐标
//     },
//   ],
// }

/** @类 解析类 */
export class Parser {
  constructor(data = {}) {
    this.data = data;
  }

  /** @方法 加载 */
  async load(renderer) {
    this.renderer = renderer;
    this.background = {
      width: 0,
      height: 0,
      offsetX: 0,
      offsetY: 0,
      ...(this.data?.background || {})
    };
    this.wrapper = {
      backgroundColor: 'rgba(0, 0, 0, 0.5)',
      ...(this.data?.wrapper || {})
    };
    this.scale = {
      rate: renderer.width / this.background.width, // 计算最小缩放率（背景不超出画布）
      scaling: 1, // 当前缩放比例
      step: 0.1, // 缩放步长
      min: 1, // 最小缩放比例
      max: 3, // 最大缩放比例
      ...(this.data?.scale || {}),
    };
    this.stages = (this.data?.stages || []).map((stage) => ({
      ...stage,
      border: (stage.border || []).map((point) => {
        const [x, y] = point.split(',');
        return { x, y };
      }),
    }));
    this.canvasCenter = { x: renderer.canvas.width / 2, y: renderer.canvas.height / 2 };
    this.bufferCenter = { x: this.background.width / 2, y: this.background.height / 2 };
    await this.render();
  }

  /** @方法 渲染背景 */
  render() {
    return new Promise((resolve, reject) => {
      const src = this.background?.src || '';
      const width = this.background?.width || 0;
      const height = this.background?.height || 0;
      if (src && width && height) {
        const image = new Image();
        image.src = src;
        image.addEventListener('load', () => {
          this.background.image = image;
          resolve();
        });
        image.addEventListener('error', () => reject(new Error('背景图片加载失败')));
      } else {
        reject(new Error('背景数据不完整'));
      }
    });
  }
}

export default Parser;
